/*
 * Copyright @2007-2008 by Infowarelab Webapps.
 */
package com.easyidea.its.domain.repository.base;

import java.io.Serializable;
import java.util.Collection;

import org.hibernate.Criteria;

import com.infowarelab.persistence.filter.base.Filter;
import com.easyidea.its.domain.model.IBean;

/**
 * base repository interface
 * 
 * @author power.wang
 * 
 * @param <T>
 */
public interface BaseRepository<T> {
	
	/**
	 * 持久化对象，并返回带ID的对象
	 * @param <E>
	 * @param bean
	 * @return
	 */
	<E> E save(E bean);
	
	/**
	 * 持久化对象
	 * 
	 * @param <E>
	 * @param bean
	 */
	<E> void update(E bean);
	
	
	<E> void merge(E bean);
	
	/**
	 * 逻辑删除对象
	 * 
	 * @param id
	 */
	void removeBeanByLogic(int id);
	
	/**
	 * 物理删除对象
	 * 
	 * @param id
	 */
	void removeBean(int id);
	
	<E> void removeBean(Class<E> clazz, int id);
	
	<E> void removeBeanByLogic(Class<E> clazz, int id);

	/**
	 * 根据id获取相应的持久化对象
	 * 
	 * @param id
	 * @return
	 */
	T getBeanById(int id);

	/**
	 * 获取对象列表,if start <=0 && size <=0 then 返回所有符合条件的记录数
	 * 
	 * @param Filter
	 *            查询条件
	 * @return
	 */
	Collection listBeans(Filter filter);

	/**
	 * 返回符合条件的记录数
	 * 
	 * @param filter
	 *            查询条件
	 * @return
	 */
	int countBeans(Filter filter);
	
	/**
	 * Execute a query for persistent instances
	 * 
	 * @param queryStr
	 *            a query expressed in Hibernate's query language
	 * @return a List containing 0 or more persistent instances
	 */
	Collection executeHqlCol(String queryStr);
	
	<E extends IBean> E getBeanById(Class<E> claz, int id);
	
	/**
	 * 执行原生 Sql的方法 Return 结果集
	 * 
	 * @param queryStr
	 * @return
	 */
	Collection executePureSqlCol(String queryStr);

	/**
	 * 执行原生 Sql的方法 Return 结果集
	 * 
	 * @param queryStr
	 * @param values
	 * @return
	 */
	Collection executePureSqlCol(String queryStr, Object[] values);

	/**
	 * 执行原生 Sql的方法 Return 结果集
	 * 
	 * @param queryStr
	 * @param values
	 * @param startAtIndex
	 * @param count
	 * @return
	 */
	Collection executePureSqlCol(String queryStr, Object[] values, int startAtIndex, int count);
	
	/**
	 * 执行原生 Sql的方法
	 * 
	 * @param sql
	 * @return
	 */
	boolean executePureSql(String sql);
	
	/**
	 * 
	 * @return
	 */
	Criteria createCriteria();
	
	Criteria createUndeleteCriteria();
	
	/**
	 * 获取对象列表,返回所有符合条件的记录数
	 * 
	 * @param criteria
	 * @return
	 */
	int countBeans(Criteria criteria);	
	

	/**
	 * 获取对象列表,if start <=0 && size <=0 then 返回所有符合条件的记录数
	 * 
	 * @param criteria
	 *            查询条件
	 * @param startAtIndex
	 *            从第startAtIndex条记录开始查询
	 * @param count
	 *            查询返回的最大记录数
	 * @return
	 */
	Collection listBeans(Criteria criteria, int startAtIndex, int count);
	
	/**
	 * 原生sql分页查询，获取object数组列表
	 * 
	 * @param sql
	 * @param start
	 *            从第start条记录开始查询
	 * @param size
	 *            查询返回的最大记录数
	 * @return
	 */
	@SuppressWarnings("unchecked")
	Collection listBeansBySql(String sql, int start, int size);
	/**
	 * 持久化对象
	 * 
	 * @param <E>
	 * @param bean
	 */
	void saveOrUpdateBean(T bean);
	/**
	 * 判断指定类的指定属性的唯一性。
	 * 
	 * @param <E>
	 * @param clazz
	 * @param propertyName
	 * @param id
	 * @param isIncludeDeleted
	 * @return
	 */
	boolean isRepeated(String propertyName, String propertyValue, Serializable id,boolean isIncludeDeleted);
	
}

